﻿using System;
using System.Text;
using System.Diagnostics;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Collections.Generic;
using Bovespa.Infra.Data;
using Bovespa.Sinacor.Servico.BaseConhecimento.Usuario.Entidades;

namespace Bovespa.Sinacor.Servico.BaseConhecimento.Usuario.Dados
{
    /// <summary>
    /// Fornece operacoes de acesso a dados para a entidade de negocio "Usuario".
    /// </summary>
    public class Usuario
    {
        #region Campos

        private int aplicacaoID = -1; //Id do Sistema

        #endregion

        #region Properties

        private int AplicacaoID
        {
            get
            {
                if (-1 == aplicacaoID)
                {
                    System.Configuration.AppSettingsReader reader = new System.Configuration.AppSettingsReader();
                    aplicacaoID = (int)reader.GetValue("ApplicationInfraID", typeof(int));
                }
                return aplicacaoID;
            }
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Recupera uma lista de entidades de negocio "Usuario" do banco de dados.
        /// </summary>
        public List<Bovespa.Sinacor.Servico.BaseConhecimento.Usuario.Entidades.Usuario> ConsultarUsuario()
        {
            List<Bovespa.Sinacor.Servico.BaseConhecimento.Usuario.Entidades.Usuario> listaUsuario = new List<Bovespa.Sinacor.Servico.BaseConhecimento.Usuario.Entidades.Usuario>();

            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_CO_TB_USUARIO");

            using (IDataReader dados = conexao.ExecuteReader())
            {
                while (dados.Read())
                {
                    Bovespa.Sinacor.Servico.BaseConhecimento.Usuario.Entidades.Usuario usuario = new Bovespa.Sinacor.Servico.BaseConhecimento.Usuario.Entidades.Usuario();

                    int codigoIndice = dados.GetOrdinal("CD_USUARIO");
                    usuario.Codigo = dados.GetInt32(codigoIndice);

                    int nomeIndice = dados.GetOrdinal("NM_LOGON_USUARIO");
                    usuario.Nome = dados.GetString(nomeIndice);

                    listaUsuario.Add(usuario);
                }
            }
            return listaUsuario;
        }

        /// <summary>
        /// Recupera uma entidade de negocio "Usuario" do banco de dados.
        /// </summary>
        public Bovespa.Sinacor.Servico.BaseConhecimento.Usuario.Entidades.Usuario ObterUsuario(Entidades.Usuario entidade)
        {
            Entidades.Usuario usuario = new Entidades.Usuario();

            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_CO_TB_USUARIO_POR_PK_LOGON");

            if (null != entidade.Nome && 0 != entidade.Nome.Length)
                conexao.AddInParameter("P_NM_LOGON_USUARIO", DbType.String, entidade.Nome);                
            else
                conexao.AddInParameter("P_CD_USUARIO", DbType.Int32, entidade.Codigo);
                
            using (IDataReader dados = conexao.ExecuteReader())
            {
                if (dados.Read())
                {
                    int codigoIndice = dados.GetOrdinal("CD_USUARIO");
                    usuario.Codigo = dados.GetInt32(codigoIndice);

                    int nomeIndice = dados.GetOrdinal("NM_LOGON_USUARIO");
                    usuario.Nome = dados.GetString(nomeIndice);

                }
            }
            return usuario;
        }

        /// <summary>
        /// Persiste uma entidade de negocio "Usuario" no banco de dados.
        /// </summary>
        public void InserirUsuario(Bovespa.Sinacor.Servico.BaseConhecimento.Usuario.Entidades.Usuario usuario)
        {
            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_IN_TB_USUARIO");
            if (usuario.Nome != null)
            {
                conexao.AddInParameter("P_NM_LOGON_USUARIO", DbType.String, usuario.Nome);
            }
            conexao.AddOutParameter("P_CD_USUARIO_RET", DbType.Int32, 4);

            conexao.ExecuteNonQuery();
        }

        /// <summary>
        /// Remove uma entidade de negocio "Usuario" do banco de dados.
        /// </summary>
        public void ExcluirUsuario(int id)
        {
            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_DL_TB_USUARIO");
            conexao.AddInParameter("P_CD_USUARIO", DbType.Int32, id);
            conexao.ExecuteNonQuery();
        }

        /// <summary>
        /// Atualiza uma entidade de negocio "Usuario" no banco de dados.
        /// </summary>
        public void AtualizarUsuario(Bovespa.Sinacor.Servico.BaseConhecimento.Usuario.Entidades.Usuario usuario)
        {
            SqlDatabase conexao = new SqlDatabase(AplicacaoID);
            conexao.CreateStoredProcCommand("SPBASE_CONHECIMENTO_UP_TB_USUARIO");
            conexao.AddInParameter("P_CD_USUARIO", DbType.Int32, usuario.Codigo);
            if (usuario.Nome != null)
            {
                conexao.AddInParameter("P_NM_LOGON_USUARIO", DbType.String, usuario.Nome);
            }
            conexao.ExecuteNonQuery();
        }

        #endregion        
    }
}

